/*
 * Servidor.cpp
 *
 *  Created on: 28/05/2012
 *      Author: sebastian
 */

#include "Servidor.h"
#include "Hilo_Enviador.h"
#include "Hilo_Recibidor.h"

Servidor::Servidor(std::string serv_port, Validador& val) : s_socket(serv_port.c_str()), validator(val), datos(val) {
	consultas = new Cola<Consulta*>;
	std::ifstream arch("datos.txt");
	datos.cargar(arch);
	//  respuestas = new Cola<Respuesta*>;
	for(int i = 0; i < MAX_WORKERS; ++i) {
		Worker* w = new Worker(*consultas, respuestas, datos);
		workers.push_back(w);
	}
	enviador = new Hilo_Enviador(*this);

}



Servidor::~Servidor() {
}

void Servidor::run() {
	s_socket.enlazar();
	s_socket.escuchar();
	for(int i = 0; i < MAX_WORKERS; ++i) {
		workers[i]->start();
	}
	enviador->start();
	while(isRunning()) {
		int client_fd = s_socket.aceptar();
		Socket* s = new Socket(Auxiliar::itos(SERVER_PORT).c_str(), client_fd);
		recibidor = new Hilo_Recibidor(*this, s);
		enviador->agregarSocket(s);
		if(!recibidor->isRunning())
			recibidor->start();
	}
}



Cola<Consulta*>* Servidor::getColaConsultas() {
	return consultas;
}

/*Cola<Respuesta*> Servidor::getColaRespuestas() {
	return respuestas;
}*/

void Servidor::pushRespuesta(Respuesta* r) {
	respuestas.push(r);
}

Respuesta* Servidor::popRespuesta() {
	return respuestas.pop();
}
